HiSEN

No MyBatis mapper was found in 'com.xxx.dao' package

出错

maven项目,启动tomcat的时候报错:

1
No MyBatis mapper was found in '[com.hisen.dao]' package

这是由于把mybatis的mapper配置文件放在了java代码的目录下

目录结构

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
├── java
│ └── com
│ └── hisen
│ ├── dao
│ │ └── BookDao.java
│ │ └── BookMapper.xml
│ ├── entity
│ │ └── Book.java
│ ├── service
│ │ ├── BookService.java
│ │ └── impl
│ │ └── BookServiceImpl.java
│ └── web
│ └── BookController.java
├── resources
│ ├── jdbc.properties
│ ├── logback.xml
│ ├── mybatis-config.xml
│ └── spring
│ ├── spring-dao.xml
│ ├── spring-service.xml
│ └── spring-web.xml
└── webapp
├── index.jsp
└── WEB-INF
├── jsp
│ ├── detail.jsp
│ └── list.jsp
└── web.xml

出错原因

这是因为mapper文件的路径问题:maven在打包的时候默认是认为src/main/java目录下只有java源代码,不会管xml文件。

Java 项目分为两个部分,一个是源码,一个是资源,在使用maven等构建工具时,

默认会将源码编译后再加上资源目录的文件放到target目录下作为最后运行的文件(可以是war,jar,或者目录)。

有时为了方便,我们会在src/main/java源码目录下放了资源文件,例如mybatis的mapper文件,方便我们编程时展开查看。

这时,我们需要设置编译时也将这些配置文件放到target目录下,否则最后的target目录式没有这些文件的。

解决办法

在项目的pom文件里面配置,让maven也从src/main/java目录下读取xml配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
<build>
<!--注意,如果将静态资源放在src/main/java中,那么编译时将被maven忽略,
在target目录下将没有这些资源,所以需要将该目录添加为资源目录.
-->
<resources>
<resource>
<directory>${basedir}/src/main/java</directory>
<includes>
<include>**/*.xml</include>
</includes>
</resource>
</resources>
</build>

扩展

如果是把mapper文件什么的放在resources目录下

但是为了分类建了不同的文件夹,也需要修改配置文件,不然会读取不到

1
2
3
4
5
6
7
8
9
10
11
12
<build>
<!--包含下面所有的配置文件(包括子目录)-->
<resources>
<resource>
<directory>${basedir}/src/main/resources</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
</resource>
</resources>
</build>